home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / fido / mmail.000 / mmail / mmail.0.1 / interface / addr_book.cc next >
Encoding:
C/C++ Source or Header  |  1996-01-27  |  6.7 KB  |  292 lines

  1. /*
  2.  * MultiMAIL offline mail reader
  3.  * 
  4.  
  5.    Written by Kolossvary Tamas (thomas@vma.bme.hu)
  6.  
  7.    This program is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 2, or (at your option)
  10.    any later version.
  11.  
  12.    This program is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with this program; if not, write to the Free Software
  19.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. #include "interface.h"
  22.  
  23. extern letter_list      *letterList;
  24. extern LetterWindow     letterwindow;
  25. extern Interface     *interface;
  26. extern Welcome        welcome;
  27. extern PacketListWindow    packets;
  28. extern AreaListWindow    areas;
  29. extern LetterListWindow    letters;
  30. extern HelpWindow    helpwindow;
  31. extern mmail        mm;
  32.  
  33.  
  34. Person :: Person(void)
  35. {
  36.     next = NULL;
  37.     netmail_addr.point = 0;
  38. }
  39.  
  40. AddressBook :: AddressBook(void)
  41. {
  42.     NumOfPersons = 0;
  43. }
  44.  
  45. void AddressBook :: MakeActive(int NOENTER)
  46. {
  47.  int i;
  48.  int end = 0;
  49.  
  50.  init_pair(56, COLOR_WHITE, COLOR_GREEN);
  51.  init_pair(57, COLOR_GREEN, COLOR_GREEN);
  52.  
  53.  position = 0;
  54.  active = 0;
  55.  list = newwin(LINES - 5, COLS - 4, 2, 2);
  56.  list_max_y = LINES - 11;
  57.  list_max_x = COLS - 6;
  58.  wattrset(list, COLOR_PAIR(56) | A_BOLD);
  59.  for(i=0; i<(LINES-5)*(COLS-4); i++)
  60.     waddch(list, ' ');
  61.  box(list, 0, 0);
  62.  mvwaddch(list, 0, 2, ACS_RTEE);
  63.  mvwaddch(list, 0, 14, ACS_LTEE);
  64.  mvwaddstr(list, list_max_y + 2, 2, "A, Q");
  65.  if(((interface->active() == letter) ||
  66.      (interface->active() ==littlearealist)) &&
  67.      (mm.areaList->getType() != bwrep))
  68.     mvwaddch(list, list_max_y + 2, 30, 'L');
  69.  wattrset(list, COLOR_PAIR(57) | A_BOLD);
  70.  mvwaddstr(list, 0, 3, "Addressbook"); 
  71.  mvwaddstr(list, 1, 2, "Name                            Netmail address");
  72.  wmove(list, list_max_y + 1, 1);
  73.  whline(list, ACS_HLINE, list_max_x);
  74.  mvwaddstr(list, list_max_y+2, 6, ": Leave Addressbook");
  75.  if(((interface->active() == letter) || 
  76.      (interface->active() == littlearealist)) &&
  77.      (mm.areaList->getType() != bwrep))
  78.     mvwaddstr(list, list_max_y+2, 31,
  79.         ": Pick sender name & NM address from letter");
  80.  // read file
  81.  ReadFile();
  82.  Draw();
  83.  
  84.  // handle keyboard
  85.  while(!end)
  86.  {
  87.     switch(wgetch(screen))
  88.     {
  89.      case 'q':    end = 1; 
  90.             if(!NOENTER)
  91.                 interface->set_dontcallEnterLetter();
  92.             break;
  93.      case 'Q':    end = 1;
  94.             if(!NOENTER)
  95.                 interface->set_dontcallEnterLetter();
  96.             break;
  97.      case 'a':    end = 1;
  98.             if(!NOENTER)
  99.                 interface->set_dontcallEnterLetter();
  100.             break;
  101.      case 'A':    end = 1;
  102.             if(!NOENTER)
  103.                 interface->set_dontcallEnterLetter();
  104.             break;
  105.      case '\033':     end = 1;
  106.             if(!NOENTER)
  107.                 interface->set_dontcallEnterLetter();
  108.             break;
  109.      case '\n':    if(!NOENTER) 
  110.             {
  111.                 SetLetterThings();
  112.                 end = 1;
  113.             }
  114.             break;
  115.     
  116.      case KEY_DOWN:  Move(DOWN); Draw(); break;
  117.          case KEY_RIGHT: Move(DOWN); Draw(); break;
  118.      case KEY_UP:      Move(UP);   Draw(); break;
  119.          case KEY_LEFT:  Move(UP);   Draw(); break;
  120.      case KEY_NPAGE: Move(PGDN); Draw(); break;
  121.      case KEY_PPAGE: Move(PGUP); Draw(); break;
  122.      case KEY_HOME:  Move(HOME); Draw(); break;
  123.      case KEY_END:     Move(END);  Draw(); break;
  124.      case 'L': if(((interface->active() == letter) || 
  125.                (interface->active() == littlearealist)) &&
  126.                (mm.areaList->getType() != bwrep))
  127.             AddressFromLetter(); 
  128.            break;
  129.          case 'l': if(((interface->active() == letter) ||
  130.                (interface->active() == littlearealist)) &&
  131.                (mm.areaList->getType() != bwrep))
  132.             AddressFromLetter();
  133.            break;
  134.     }
  135.  }
  136.  
  137.  // set NM address if enter pressed
  138.  // call DestroyChain
  139.  DestroyChain();
  140.  
  141.  // delete window
  142.  delwin(list);
  143.  touchwin(screen);
  144.  wnoutrefresh(screen);
  145.  switch(interface->active())
  146.  {
  147.      case packetlist:    welcome.ReDraw();
  148.                 packets.ReDraw();
  149.                 break;
  150.     case arealist:        areas.ReDraw();
  151.                 break;
  152.     case letterlist:    letters.ReDraw();
  153.                 break;
  154.     case threadlist:    break;
  155.     case letter:        letterwindow.ReDraw();
  156.                 break;
  157.     case letter_help:    letterwindow.ReDraw();
  158.                 break;
  159.     case littlearealist:    break;
  160.  }
  161.  helpwindow.redraw();
  162. }
  163.  
  164. void AddressBook :: SetLetterThings (void)
  165. {
  166.  letterwindow.set_Letter_Params(&(highlighted->netmail_addr),
  167.                 highlighted->name);
  168. }
  169.  
  170. void AddressBook :: AddressFromLetter (void)
  171. {
  172.  net_address Address;
  173.  FILE *fd;
  174.  
  175.  Address = letterwindow.PickNetAddr();
  176.  fd = fopen(mm.resourceObject->get(bwAddressBook), "a");
  177.  fprintf(fd, "%s\n%d:%d/%d.%d\n\n", letterList->getFrom(),
  178.                     Address.zone,
  179.                     Address.net,
  180.                     Address.node,
  181.                     Address.point);
  182.  fclose(fd);
  183.  ReadFile();
  184.  Draw();
  185. }
  186.  
  187. void AddressBook :: Draw(void)
  188. {
  189.  int i;
  190.  int y, x;
  191.  
  192.  init_pair(58, COLOR_RED, COLOR_GREEN);
  193.  wattrset(list, COLOR_PAIR(58));
  194.  if(NumOfPersons == 0)
  195.     mvwaddstr(list, 5, 20, "It seems we don't have addressbook.");
  196.  else
  197.  {
  198.     mvwaddstr(list, 5, 20, "                                   ");
  199.      curr = head.next;
  200.     for(i=0; i < position; i++)
  201.         curr = curr->next;
  202.     for(i=1; i < list_max_y; i++)
  203.     {
  204.         if(position + i - 1 == active) 
  205.         {
  206.             wattron(list, A_REVERSE);
  207.             highlighted = curr;
  208.         }
  209.         else
  210.             wattroff(list, A_REVERSE);
  211.         mvwprintw(list, i+1, 1, " %-31s",
  212.               curr->name);
  213.         if(curr->netmail_addr.point > 0)
  214.             wprintw(list, " %d:%d/%d.%d", 
  215.                 curr->netmail_addr.zone,
  216.                 curr->netmail_addr.net,
  217.                 curr->netmail_addr.node,
  218.                 curr->netmail_addr.point);
  219.         else
  220.             wprintw(list, " %d:%d/%d", 
  221.                 curr->netmail_addr.zone,
  222.                 curr->netmail_addr.net, 
  223.                 curr->netmail_addr.node);
  224.         getyx(list, y, x);
  225.         while(x <= list_max_x)
  226.             mvwaddch(list, y, x++, ' ');
  227.         curr = curr->next;
  228.         if(position+i == NumOfPersons) i = list_max_y;
  229.     }
  230.  }
  231.  wrefresh(list);
  232. }
  233.  
  234. int AddressBook :: NumOfItems(void)
  235. {
  236.  return NumOfPersons;
  237. }
  238.  
  239. void AddressBook :: ReadFile(void)
  240. {
  241.  FILE *fd;
  242.  int end = 0;
  243.  char name[255];
  244.  char nmaddr[255];
  245.  char other[255];
  246.  
  247.  if((fd = fopen(mm.resourceObject->get(bwAddressBook), "r")) != NULL)
  248.  {
  249.   DestroyChain(); 
  250.   curr = &head;
  251.   while(!end)
  252.   {
  253.     do
  254.         if(fgets(name, 254, fd) == NULL) end = 1;
  255.     while(name[0] == '\n' && !end);
  256.     if(fgets(nmaddr, 254, fd) == NULL) end = 1;
  257.         else 
  258.     {
  259.      curr->next = new Person;
  260.      curr = curr->next;
  261.      name[strlen(name) - 1] = '\0';
  262.      name[29] = '\0';
  263.      strcpy(curr->name, name);
  264.      sscanf(nmaddr, "%d:%d/%d.%d",     &curr->netmail_addr.zone,
  265.                     &curr->netmail_addr.net, 
  266.                     &curr->netmail_addr.node,
  267.                     &curr->netmail_addr.point);
  268.      NumOfPersons++;
  269.     }
  270.     do
  271.         if(fgets(other, 254, fd) == NULL) end = 1; 
  272.     while(other[0] != '\n' && !end);        
  273.   }
  274.   fclose(fd);  
  275.  }
  276. }
  277.  
  278. void AddressBook :: DestroyChain(void)
  279. {
  280.  Person *tmp; 
  281.  
  282.  curr = head.next;
  283.  while(curr != NULL)
  284.  {
  285.     tmp = curr;
  286.     curr = curr->next;
  287.     delete tmp;
  288.  }
  289.  head.next = NULL;
  290.  NumOfPersons = 0;
  291. }
  292.